#ifndef __TUILE_H__
#define __TUILE_H__ 

#include "Timer.h"
#include "Global.h"

const int VIT_ANIM_FLEUR  = VIT_ANIMATION  * 3;
const int VIT_ANIM_TORCHE  = VIT_ANIMATION  * 2;

class Tuile
{
    public:

		friend class Carte;

		Tuile() : ID(0), type(TUILE_NONE) {}

		Tuile(int ID, TypeTuile type = TUILE_NORMAL)
		{ 
			this->type  = (ID == 0) ? TUILE_NONE : type;
			this->ID    = (ID == 0) ? 0 : ID - 1;

			setTypeObjet();
		}

		virtual int getID()
		{ return ID; }

		TypeObjet soulever()
		{
			TypeObjet tmp = objet;

			switch (ID)
			{
				case 30 : ID = 40 ; break;	// Pot
				case 31 : ID = 40 ; break;	// Crane
				case 32 : ID = 41 ; break;	// Roche
				case 33 : ID = 42 ; break;	// Pancarte
			}

			objet = OBJ_NONE;
			return tmp;
		}

		~Tuile() {}

	protected:

		void setTypeObjet()
		{
			switch (ID)
			{
				case 30   : objet = OBJ_POT      ; break;
				case 31   : objet = OBJ_CRANE    ; break;
				case 32   : objet = OBJ_ROCHE    ; break;
				case 33   : objet = OBJ_PANCARTE ; break;
				case 1180 : objet = OBJ_TORCHE   ; break;
				default   : objet = OBJ_NONE;
			}
		}

		int ID;
		TypeTuile type;
		TypeObjet objet;
};

class Fleur : public Tuile
{
    public:

		friend class Carte;

		Fleur() : Tuile(), frame(0) { init(); }

		Fleur(int ID, TypeTuile type=TUILE_NORMAL) : Tuile(ID, type), frame(0) { init(); }

		void init()
		{
			tabID[0] = 128 ; tabID[1] = 129;
			tabID[2] =   1 ; tabID[3] =   1;
			tabID[4] = 129 ; tabID[5] = 128;

			anim.start();
		}

		int getID()
		{
			int IDTuile = tabID[frame];

			if( anim.get_ticks() >= VIT_ANIM_FLEUR ) 
			{
				frame++;
				if ( frame == 6 ) frame = 0;

				anim.start();
			}

			return IDTuile;
		}

		~Fleur() {}

	private:

		int frame;
		int tabID[6];

		Timer anim;
};

class Torche : public Tuile
{
    public:

		friend class Carte;

		Torche() : Tuile(), frame(0), estAllumer(false), introduireDelais(false), delais(0) { init(); }

		Torche(int ID, int delais=0, TypeTuile type=TUILE_NORMAL) 
			: Tuile(ID, type), frame(0), estAllumer(false), introduireDelais(false), delais(delais)
		{ 
			init();

			if (delais != 0)
				introduireDelais = true;
		}

		void init()
		{
			tabID[0] = 1180;
			tabID[1] = 1181 ; tabID[2] = 1181;
			tabID[3] = 1182 ; tabID[4] = 1182;
			tabID[5] = 1183 ; tabID[6] = 1183;
		}

		int getID()
		{
			int IDTuile = tabID[frame];

			if( estAllumer )
			{
				if ( introduireDelais && timerDelais.get_ticks() >= delais )
				{
					eteindre();
					IDTuile = tabID[frame];
				}
				else if ( anim.get_ticks() >= VIT_ANIM_TORCHE ) 
				{
					frame++;
					if ( frame == 7 ) frame = 1;

					anim.start();
				}
			}

			return IDTuile;
		}

		void allumer() { estAllumer = true ; anim.start(); timerDelais.start(); }

		~Torche() {}

	private:

		void eteindre() { frame = 0 ; estAllumer = false ; anim.stop(); timerDelais.stop(); }

		int frame;
		int tabID[7];
		bool estAllumer;
		Timer anim;

		Timer timerDelais;
		bool introduireDelais;
		int delais;
};

#endif //__TUILE_H__
